//
//  LocationRequestAPI.swift
//  QingLiuSwift
//
//  Created by xyanl on 2024/1/12.
//  Copyright © 2024 考拉🐨. All rights reserved.
//

import Foundation
import Moya
import SwiftyUserDefaults
import CoreLocation

// RequestAPI就是一个遵循TargetType协议的枚举
enum LocationRequestAPI {
    
    /// 地区列表
    /// - Parameters:
    ///   - pid: 父级id 搜索所有国家传0，搜索城市传国家ID, nil 不传
    ///   - name: 搜索名称，中英文通通
    ///   - recommend: 0：普通，1：推荐，热门
    ///   - level: 0:全部 1：国家，2：省，3：市
    case list(pid: Int?, name: String?, recommend: Int = 0, level: Int = 1)
    
    /// 获取某国家下的城市列表
    /// - Parameters:
    ///   - id: 国家 id
    case cityList(id: Int)
    
    
    /// 根据 国家、城市名字，获取对应的国家id和城市id
    /// - Parameters:
    ///   - country: 国家名称
    ///   - city: 城市名称
    /// - Returns: 获取对应的国家id和城市id
    case nameToID(country: String?, city: String?)
    
    /// 签到
    /// - Parameters:
    ///   - week: 1：周一，2：周二 。。。
    case signIn(_ week: Int)
    
}

extension LocationRequestAPI: TargetType {
    // 请求地址
    var baseURL: URL {
        return URL(string: SystemEnvManager.shared.phpUrl)!
    }
    
    // 请求API
    var path: String {
        switch self {
        case .list: return "/api/area/list"
        case .cityList: return "/api/area/listByRecursion"
            
        case .nameToID: return "/api/area/nameToAreaId"
        case .signIn: return "/api/signIn/sign"
        }
    }
    
    // 请求方式: post/get
    var method: Moya.Method {
        switch self {
        default: // 默认post请求
            return .post
        }
    }
    
    // 请求任务
    var task: Moya.Task {
        // 公共参数
        var params: [String: Any] = [:]
        // 根据不同的接口传入不同的参数
        switch self {
        case .list(let pid, let name, let recommend, let level):
            params["pid"] = pid
            params["name"] = name
            params["recommend"] = recommend
            params["level"] = level == 0 ? nil : level
            
        case .cityList(let id):
            params["country_id"] = id
            
        case .nameToID(let country, let city):
            params["country"] = country
            params["city"] = city
            
        case .signIn(let week):
            params["week"] = week
            
        }
        
        // 设置请求类型, 比如没有参数的请求、有参数的请求、上传文件、下载文件
        switch self {
//        case .info:
//            // 没有请求参数的请求。
//            return .requestPlain
            
        default:
            // 有请求参数
            return .requestParameters(parameters: params, encoding: JSONEncoding.default)
        }
    }
    
    // 公共头部信息
    var headers: [String: String]? {
        var headers: [String: String] = [:]
        headers["token"] = Defaults[\.token]
        headers["client"] = "app"
        headers["Content-type"] = "application/json;charset=utf-8"
        headers["requestStartTime"] = String(CFAbsoluteTimeGetCurrent())
        switch self {
            
        default:
            headers["Content-type"] = "application/json;charset=utf-8"
        }
        
        return headers
    }
}
